package code;
//2.客户端代码：--------------------------------------------------------------------------------

import javax.swing.*;

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.*;
import java.io.*;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class Client extends JFrame implements ActionListener {
private    static String IP;//服务端的IP地址
private    static int port=50000;//端口号
private    static String path;//接收文件的路径
private    static String savepath;//保存文件的路径
    
    //定义音频类
    audioUtils client=null;
    // 定义所需要的组件
    JPanel jp1, jp2, jp3,jp4;
    JLabel jl1 = null;
    JButton captureBtn, stopBtn, playBtn, saveBtn,sendBtn,linkBtn,delinkBtn,setButton;
    JTextField  iptxt,repath,svpath;
    JLabel linkLabel=null;
    JLabel rdLabel=null;
    private Socket s;
    // 构造函数
    public  Client() {
        
        //音频类初始化
       client=new audioUtils();
       //文本框初始化
       iptxt=new JTextField("123.57.60.39");
       repath=new JTextField("E:\\JAVA2022\\javaSE\\毕设\\src\\voice\\clientReceived");
//        repath=new JTextField("输入接收录音文件保存的路径");
       svpath=new JTextField("E:\\JAVA2022\\javaSE\\毕设\\src\\voice\\clientSend");
//        svpath=new JTextField("输入要保存的录音文件路径");
        // 组件初始化
        jp1 = new JPanel();
        jp2 = new JPanel();
        jp3 = new JPanel();
        jp4=new JPanel();
        
        //定义连接和录音提示
         linkLabel=new JLabel("未连接");
         rdLabel=new JLabel("");
        // 定义字体
        Font myFont = new Font("宋体", Font.BOLD, 30);
        jl1 = new JLabel("实时通信系统客户端");
        jl1.setFont(myFont);
        captureBtn = new JButton("开始录音");
        // 对开始录音按钮进行注册监听
        captureBtn.addActionListener(this);
        captureBtn.setActionCommand("captureBtn");
        // 对停止录音进行注册监听
        stopBtn = new JButton("停止录音");
        stopBtn.addActionListener(this);
        stopBtn.setActionCommand("stopBtn");
        // 对播放录音进行注册监听
        playBtn = new JButton("播放录音");
        playBtn.addActionListener(this);
        playBtn.setActionCommand("playBtn");
        // 对保存录音进行注册监听
        saveBtn = new JButton("保存录音");
        saveBtn.addActionListener(this);
        saveBtn.setActionCommand("saveBtn");
        //对发送录音进行注册监听
        sendBtn=new JButton("发送录音");
        sendBtn.addActionListener(this);
        sendBtn.setActionCommand("sendBtn");
        //对连接录音进行注册监听
        linkBtn=new JButton("连接");
        linkBtn.addActionListener(this);
        linkBtn.setActionCommand("linkBtn");
        //对断开连接进行注册监听
        delinkBtn=new JButton("断开连接");
        delinkBtn.addActionListener(this);
        delinkBtn.setActionCommand("delinkBtn");
        //对设置ip，路径等监听
        setButton=new JButton("保存设置");
        setButton.addActionListener(this);
        setButton.setActionCommand("setButton");
        
        this.add(jp1, BorderLayout.NORTH);
        this.add(jp2, BorderLayout.CENTER);
        this.add(jp3, BorderLayout.SOUTH);
        this.add(jp4,BorderLayout.NORTH);
        jp3.setLayout(null);
        jp3.setLayout(new GridLayout(1, 4, 10, 10));
        jp4.add(iptxt);
//        jp4.add(svpath);
//        jp4.add(repath);
        jp4.add(setButton);
        jp2.add(rdLabel);
        jp2.add(linkBtn);
        jp2.add(delinkBtn);
        jp2.add(linkLabel);
        jp3.add(captureBtn);
        jp3.add(stopBtn);
        jp3.add(playBtn);
        jp3.add(saveBtn);
        jp3.add(sendBtn);
        // 设置按钮的属性
        this.linkBtn.setEnabled(false);
        this.delinkBtn.setEnabled(false);
        this.captureBtn.setEnabled(false);
        this.stopBtn.setEnabled(false);
        this.playBtn.setEnabled(false);
        this.saveBtn.setEnabled(false);
        this.sendBtn.setEnabled(false);
        this.setButton.setEnabled(true);
        // 设置窗口的属性
        this.setSize(700, 500);
        this.setTitle("客户端");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
        this.setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals("captureBtn")) {
            // 点击开始录音按钮后的动作
            // 停止按钮可以启动
            captureBtn.setEnabled(false);
            stopBtn.setEnabled(true);
            playBtn.setEnabled(false);
            saveBtn.setEnabled(false);
            sendBtn.setEnabled(false);
            
            // 调用录音的方法
            capture();
            rdLabel.setText("正在录音..");
        } else if (e.getActionCommand().equals("stopBtn")) {
            // 点击停止录音按钮的动作
            captureBtn.setEnabled(true);
            stopBtn.setEnabled(false);
            playBtn.setEnabled(true);
            saveBtn.setEnabled(true);
            if(!linkBtn.isEnabled()){
                sendBtn.setEnabled(true);
            }
            
            // 调用停止录音的方法
            stop();
            rdLabel.setText("完成录音..");
        } else if (e.getActionCommand().equals("playBtn")) {
            // 调用播放录音的方法
            play();
        } else if (e.getActionCommand().equals("saveBtn")) {
            // 调用保存录音的方法
            rdLabel.setText("保存录音..");
            save();
        }else if(e.getActionCommand().equals("sendBtn")){
            rdLabel.setText("发送录音..");
            send();
        }
        else if(e.getActionCommand().equals("linkBtn")){
            linkBtn.setEnabled(false);
            delinkBtn.setEnabled(true);
            if(saveBtn.isEnabled())
            sendBtn.setEnabled(true);
            link();
            if(s.isConnected())
            linkLabel.setText("已连接:");
        }
        else if(e.getActionCommand().equals("delinkBtn")){
            delinkBtn.setEnabled(false);
            linkBtn.setEnabled(true);
            sendBtn.setEnabled(false);
            delink();
            linkLabel.setText("未连接:");
        }else if(e.getActionCommand().equals("setButton")){
        
            //校验ip地址
            Pattern p = Pattern.compile("^((25[0-5]|2[0-4]\\d|[1]{1}\\d{1}\\d{1}|[1-9]{1}\\d{1}|\\d{1})($|(?!\\.$)\\.)){4}$");
            Matcher m = p.matcher(iptxt.getText());
            boolean b = m.matches();
            if(!b){
                iptxt.setText("IP输入不合法");
                return ;
            }
             IP=iptxt.getText().trim();
             
             path=repath.getText().trim();
             savepath=svpath.getText().trim();
             if(new File(savepath).isDirectory())
             {
                 savepath+="/"+System.currentTimeMillis()+".mp3";
                 this.captureBtn.setEnabled(true);
             }else{
                 svpath.setText("文件路径不存在!");
                 return ;
             }
             
             if(new File(path).isDirectory())
             {
                 path+="/recied.mp3";
             }else{
                 repath.setText("文件路径不存在!");
                 return;
             }
             this.linkBtn.setEnabled(true);
             this.setButton.setEnabled(false);
             JOptionPane.showMessageDialog(null, "设置成功");
        }
    }
    
    //连接到服务端
    public void link()
    {
        //初始化一个套接字
         try {
                s=new Socket(IP,port);
            //开启一个接收文件的线程
            client.recied(s, new File(path));
        } catch (UnknownHostException e) {
            System.out.println("连接失败");
        } catch (IOException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
    }
    
    /*
     * 断开连接
     * （必须再连接之后再调用此方法，否则控制台会打印当前并无连接。)
     * throws IOExcpetion e(关闭异常失败)
     */
    public void delink() {
         if(s.isClosed())System.out.println("当前并无连接");
        try {
            s.close();
        } catch (IOException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
    }
    
    //录音
    public void capture(){
        client.capture();
    }
    

    // 停止录音
    public void stop(){
    client.stop();
}

    //播放录音(默认播放刚刚完成的录音)
    public void play(){
    client.play();
}

    // 保存录音
    public void save(){
    client.save(new File(savepath));
}
    
    //发送录音到服务端（不保存到本地的发送)
    public void send(){
        client.send();
    }
    //
    public static void main(String[] args) {
        // 创造一个实例
        Client tc=new Client();
    }


}